fn main() {

    // case1: 变量
    let mut x = 5;
    println!("{x}");

    x = 6;
    println!("{x}");

    // case2: 常量
    const TOTAL: i32 = 10;

    // case3: shadowing
    let y = 1;
    println!("{y}");
    // 此处注意与case1中的区别，多了let关键字
    let y = y + 1;
    println!("{y}");

    {
        let y = y * 2;
        println!("{y}");
    }
    // 出了作用域，y仍然未改变
    println!("{y}");

    // case4: 变量遮蔽改变类型
    let spaces = "   ";
    let spaces = spaces.len();
    println!("${spaces}");

    let baby_egg = '😊';
    println!("{baby_egg}");

    // case5 tuple
    let tup = (1, 'a', "李四");
    // 解构
    let (x, _y, _z) = tup;
    println!("{x}");

    // case6 array
    let arr = [1, 2, 3, 4];
    let arr_index0 = arr[0];
    println!("{arr_index0}");

    // 相当于 let arr = [3, 3, 3, 3, 3];
    let _arr = [3; 5];

    // case7 函数调用
    let _return_val = test("张三", 50);

    // case8 表达式、带返回值的函数
    let x = 11;
    let y = 2;
    let result = cal_add(x, y);
    println!("{x} + {y} = {result}");

    // case 9 if判断
    let x = 20;
    if x > 0 {
        println!("这是正数")
    } else if x < 0 {
        println!("这是复数")
    } else {
        println!("这是0")
    }

    // if 在let语句中的使用。
    // 每个分支中的类型必须一致
    let y = if x > 0 { -10 } else { 10 };
    println!("{y}");

    // case10 loop 循环，配合break 跳出循环
    loop_test(1);
    // case11 while循环
    while_test(10);
    // case12 for 循环
    for_test();
}

fn test(name :&str, age :u32) {
    println!("{name}的年龄为{age}")
}

fn cal_add(x:i32, y:i32) -> i32 {
    // 不带; 则说明为表达式
    x + y
}

fn loop_test(mut counter: i32) {
    let result = loop {
        counter += 1;

        if counter > 10 {
            break counter * 2;
        }
    };
    println!("循环后结果为:{result}")
}

fn while_test(mut counter: i32) {
    while counter > 0 {
        print!("{counter} ");
        counter -= 1;
    }
}

fn for_test(){
    println!();
    let arr = [1, 2, 3, 4];
    for e in arr {
        print!("{e}");
    }
}